home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / lib / flyEngine / flyStripfan.cpp < prev   
Encoding:
C/C++ Source or Header  |  2000-11-21  |  6.8 KB  |  281 lines

  1. #include "..\..\lib\Fly3D.h"
  2.  
  3. void stripfan_mesh::reset()
  4. {
  5.     if (stripfandata) delete stripfandata;
  6.     if (vertdata) delete vertdata;
  7.     nstripfan=0;
  8.     stripfandata=0;
  9.     vertdata=0;
  10.     nvert=0;
  11. }
  12.  
  13. void stripfan_mesh::draw(int mode)
  14. {
  15.     int i,j,k,n,mapcount=0;
  16.     if (nstripfan)
  17.     if (flyengine->multitexture && ntextureunits>1 && flyengine->nlm)
  18.         {
  19.         k=0;
  20.         for( i=0;i<nstripfan;i+=3 )
  21.             {
  22.             tc->use(stripfandata[i+1]);
  23.             if (stripfandata[i+2]!=-1)
  24.                 tc->use(flyengine->lm[stripfandata[i+2]]->pic+flyengine->lmbase,1);
  25.             else 
  26.                 tc->use(-1,1);
  27.             n=abs(stripfandata[i]);
  28.             if (stripfandata[i]>0)
  29.                 glBegin(GL_TRIANGLE_STRIP);
  30.             else 
  31.                 glBegin(GL_TRIANGLE_FAN);
  32.             for( j=0;j<n;j++,k++ )
  33.                 {
  34.                 glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,&vertdata[k].u);
  35.                 glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,&vertdata[k].ul);
  36.                 glVertex3fv(&vertdata[k].pos.x);
  37.                 }
  38.             glEnd();
  39.             }
  40.         tc->use(-1,1);
  41.         tc->use(-1,0);
  42.         mapcount+=2;
  43.         }
  44.     else
  45.         {
  46.         if (mode&MAPPING_TEXTURE &&
  47.             flyengine->mapmode&MAPPING_TEXTURE)
  48.             {
  49.             k=0;
  50.             for( i=0;i<nstripfan;i+=3 )
  51.                 {
  52.                 tc->use(stripfandata[i+1]);
  53.                 n=abs(stripfandata[i]);
  54.                 if (stripfandata[i]>0)
  55.                     glBegin(GL_TRIANGLE_STRIP);
  56.                 else 
  57.                     glBegin(GL_TRIANGLE_FAN);
  58.                 for( j=0;j<n;j++,k++ )
  59.                     {
  60.                     glTexCoord2fv(&vertdata[k].u);
  61.                     glVertex3fv(&vertdata[k].pos.x);
  62.                     }
  63.                 glEnd();
  64.                 }
  65.             mapcount++;
  66.             }
  67.  
  68.         if (mode&MAPPING_DETAIL &&
  69.             flyengine->mapmode&MAPPING_DETAIL &&
  70.             flyengine->detailpic!=-1)
  71.             {
  72.             if (mapcount)
  73.                 {
  74.                 glBlendFunc(GL_ZERO,GL_SRC_COLOR);
  75.                 glDepthMask(GL_FALSE);
  76.                 glDepthFunc(GL_EQUAL);
  77.                 }
  78.             k=0;
  79.             tc->use(flyengine->detailpic);
  80.             for( i=0;i<nstripfan;i+=3 )
  81.                 {
  82.                 n=abs(stripfandata[i]);
  83.                 if (stripfandata[i]>0)
  84.                     glBegin(GL_TRIANGLE_STRIP);
  85.                 else 
  86.                     glBegin(GL_TRIANGLE_FAN);
  87.                 for( j=0;j<n;j++,k++ )
  88.                     {
  89.                     glTexCoord2f(
  90.                         vertdata[k].u*flyengine->detailtile,
  91.                         vertdata[k].v*flyengine->detailtile);
  92.                     glVertex3fv(&vertdata[k].pos.x);
  93.                     }
  94.                 glEnd();
  95.                 }
  96.             mapcount++;
  97.             }
  98.  
  99.         if (mode&MAPPING_LIGHTMAP &&
  100.             flyengine->mapmode&MAPPING_LIGHTMAP &&
  101.             flyengine->nlm!=0)
  102.             {
  103.             if (mapcount)
  104.                 {
  105.                 glBlendFunc(GL_ZERO,GL_SRC_COLOR);
  106.                 glDepthMask(GL_FALSE);
  107.                 glDepthFunc(GL_EQUAL);
  108.                 }
  109.             k=0;
  110.             for( i=0;i<nstripfan;i+=3 )
  111.                 {
  112.                 if (stripfandata[i+2]==-1)
  113.                     {
  114.                     k+=n;
  115.                     continue;
  116.                     }
  117.                 else tc->use(flyengine->lm[stripfandata[i+2]]->pic+flyengine->lmbase);
  118.                 n=abs(stripfandata[i]);
  119.                 if (stripfandata[i]>0)
  120.                     glBegin(GL_TRIANGLE_STRIP);
  121.                 else 
  122.                     glBegin(GL_TRIANGLE_FAN);
  123.                 for( j=0;j<n;j++,k++ )
  124.                     {
  125.                     glTexCoord2fv(&vertdata[k].ul);
  126.                     glVertex3fv(&vertdata[k].pos.x);
  127.                     }
  128.                 glEnd();
  129.                 }
  130.             mapcount++;
  131.             }
  132.         }
  133.  
  134.     if (mode&MAPPING_FOGMAP &&
  135.         flyengine->mapmode&MAPPING_FOGMAP &&
  136.         flyengine->nlm!=0)
  137.         {
  138.         if (mapcount)
  139.             {
  140.             glDepthMask(GL_FALSE);
  141.             glDepthFunc(GL_EQUAL);
  142.             glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
  143.             }
  144.         k=0;
  145.         for( i=0;i<nstripfan;i+=3 )
  146.             {
  147.             if (stripfandata[i+2]==-1)
  148.                 {
  149.                 k+=n;
  150.                 continue;
  151.                 }
  152.             else tc->use(stripfandata[i+2]+flyengine->fmbase);
  153.             n=abs(stripfandata[i]);
  154.             if (stripfandata[i]>0)
  155.                 glBegin(GL_TRIANGLE_STRIP);
  156.             else 
  157.                 glBegin(GL_TRIANGLE_FAN);
  158.             for( j=0;j<n;j++,k++ )
  159.                 {
  160.                 glTexCoord2fv(&vertdata[k].ul);
  161.                 glVertex3fv(&vertdata[k].pos.x);
  162.                 }
  163.             glEnd();
  164.             }
  165.         mapcount++;
  166.         }
  167.  
  168.     glDepthMask(GL_TRUE);
  169.     glDepthFunc(GL_LESS);
  170.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  171. }
  172.  
  173. mesh *stripfan_mesh::build_mesh()
  174. {
  175.     int i,j,k=0,v=0,f=0,n;
  176.     mesh *objmesh=new mesh;
  177.     for( i=0;i<nstripfan;i+=3 )
  178.     {
  179.         objmesh->nf+=abs(stripfandata[i])-2;
  180.         objmesh->nv+=abs(stripfandata[i]);
  181.     }
  182.     objmesh->faces=new face *[objmesh->nf];
  183.     objmesh->localfaces=new face [objmesh->nf];
  184.     objmesh->vert=new vector[objmesh->nv];
  185.     objmesh->color.vec(1.0f,1.0f,1.0f);
  186.     for( i=0;i<objmesh->nf;i++ )
  187.         objmesh->faces[i]=&objmesh->localfaces[i];
  188.     for( i=0;i<nstripfan;i+=3 )
  189.     {
  190.         n=abs(stripfandata[i]);
  191.         if (stripfandata[i]>0)
  192.         {
  193.             for( j=2;j<n;j++ )
  194.             {
  195.                 objmesh->localfaces[f].color.vec(1.0f,1.0f,1.0f,1.0f);
  196.                 objmesh->localfaces[f].texpic=stripfandata[i+1];
  197.                 objmesh->localfaces[f].lm=stripfandata[i+2];
  198.                 if (j&1)
  199.                     {
  200.                     objmesh->localfaces[f].vert[0]=&objmesh->vert[v+j-1];
  201.                     objmesh->localfaces[f].vert[1]=&objmesh->vert[v+j-2];
  202.                     objmesh->localfaces[f].lmuv[0][0]=vertdata[k+j-1].ul;
  203.                     objmesh->localfaces[f].lmuv[0][1]=vertdata[k+j-1].vl;
  204.                     objmesh->localfaces[f].lmuv[1][0]=vertdata[k+j-2].ul;
  205.                     objmesh->localfaces[f].lmuv[1][1]=vertdata[k+j-2].vl;
  206.                     }
  207.                 else
  208.                     {
  209.                     objmesh->localfaces[f].vert[0]=&objmesh->vert[v+j-2];
  210.                     objmesh->localfaces[f].vert[1]=&objmesh->vert[v+j-1];
  211.                     objmesh->localfaces[f].lmuv[0][0]=vertdata[k+j-2].ul;
  212.                     objmesh->localfaces[f].lmuv[0][1]=vertdata[k+j-2].vl;
  213.                     objmesh->localfaces[f].lmuv[1][0]=vertdata[k+j-1].ul;
  214.                     objmesh->localfaces[f].lmuv[1][1]=vertdata[k+j-1].vl;
  215.                     }
  216.                 objmesh->localfaces[f].vert[2]=&objmesh->vert[v+j];
  217.                 objmesh->localfaces[f].lmuv[2][0]=vertdata[k+j].ul;
  218.                 objmesh->localfaces[f].lmuv[2][1]=vertdata[k+j].vl;
  219.                 f++;
  220.             }
  221.         }
  222.         else
  223.         {
  224.             for( j=2;j<n;j++ )
  225.             {
  226.                 objmesh->localfaces[f].color.vec(1.0f,1.0f,1.0f,1.0f);
  227.                 objmesh->localfaces[f].texpic=stripfandata[i+1];
  228.                 objmesh->localfaces[f].lm=stripfandata[i+2];
  229.                 objmesh->localfaces[f].vert[0]=&objmesh->vert[v];
  230.                 objmesh->localfaces[f].vert[1]=&objmesh->vert[v+j-1];
  231.                 objmesh->localfaces[f].vert[2]=&objmesh->vert[v+j];
  232.                 objmesh->localfaces[f].lmuv[0][0]=vertdata[k].ul;
  233.                 objmesh->localfaces[f].lmuv[0][1]=vertdata[k].vl;
  234.                 objmesh->localfaces[f].lmuv[1][0]=vertdata[k+j-1].ul;
  235.                 objmesh->localfaces[f].lmuv[1][1]=vertdata[k+j-1].vl;
  236.                 objmesh->localfaces[f].lmuv[2][0]=vertdata[k+j].ul;
  237.                 objmesh->localfaces[f].lmuv[2][1]=vertdata[k+j].vl;
  238.                 f++;
  239.             }
  240.         }
  241.         for( j=0;j<n;j++ )
  242.         {
  243.             objmesh->vert[v].x=vertdata[k].pos.x;
  244.             objmesh->vert[v].y=vertdata[k].pos.y;
  245.             objmesh->vert[v].z=vertdata[k].pos.z;
  246.             v++; k++;
  247.         }
  248.     }
  249.     objmesh->compute_normals(MESH_FACENORM|MESH_VERTNORM|MESH_BBOX);
  250.     return objmesh;
  251. }
  252.  
  253. vertex *stripfan_mesh::add_stripfan(int nv,int texpic,int lmpic)
  254. {
  255.     int *tmp1=new int[nstripfan+3];
  256.     if (stripfandata)
  257.     {
  258.         memcpy(tmp1,stripfandata,sizeof(int)*nstripfan);
  259.         delete stripfandata;
  260.     }
  261.     stripfandata=tmp1;
  262.  
  263.     stripfandata[nstripfan++]=nv;
  264.     stripfandata[nstripfan++]=texpic;
  265.     stripfandata[nstripfan++]=lmpic;
  266.  
  267.     nv=abs(nv);
  268.     vertex *tmp2=new vertex[nvert+nv];
  269.     if (vertdata)
  270.     {
  271.         memcpy(tmp2,vertdata,sizeof(vertex)*nvert);
  272.         delete vertdata;
  273.     }
  274.     vertdata=tmp2;
  275.  
  276.     memset(&vertdata[nvert],0,sizeof(vertex)*nv);
  277.  
  278.     nvert+=nv;
  279.     return &vertdata[nvert-nv];
  280. }
  281.